package com.wang.tool.monitor;

import com.wang.tool.monitor.core.LinkHolder;
import com.wang.tool.monitor.core.LinkTransmitter;
import com.wang.tool.monitor.log.LogApi;
import com.wang.tool.monitor.callback.GlobalMonitorCallback;
import com.wang.tool.monitor.callback.MonitorCallback;
import com.wang.tool.monitor.translator.ErrorTranslator;
import com.wang.tool.monitor.translator.GlobalErrorTranslator;
import com.wang.tool.monitor.weaver.TypeWeaver;
import com.wang.tool.monitor.weaver.TypeWeaverFactory;
import com.wang.tool.monitor.writer.GlobalMonitorWriter;
import com.wang.tool.monitor.writer.MonitorWriter;

/**
 * @Description monitor配置中心
 * @Author shaopeng
 * @Date 2022/11/4
 * @Version 1.0
 */
public class MonitorConfigCenter {


    /**
     * 必设
     *
     * @param logApi logApi
     */
    public static void setLogApi(LogApi logApi) {
        LinkLogUtil.setLogApi(logApi);
    }

    /**
     * 必设
     * 设置全局监控输出器
     * 不配置则无法输出日志
     *
     * @param globalWriter
     */
    public static void setMonitorWriter(MonitorWriter globalWriter) {
        GlobalMonitorWriter.setWriter(globalWriter);
    }


    /**
     * 强烈建议
     * 设置链路传送器
     * 不设置则无链路关系数据,所以节点都会是根节点(找不到爹)
     *
     * @param transmitter
     */
    public static void setLinkTransmitter(LinkTransmitter transmitter) {
        LinkHolder.setTransmitter(transmitter);
    }


    /**
     * 必设
     * 设置全局异常翻译器
     * 不配置则采用基础异常转换器
     *
     * @param globalTranslator 非空
     */
    public static void setTranslator(ErrorTranslator globalTranslator) {
        GlobalErrorTranslator.setTranslator(globalTranslator);
    }


    /**
     * 设置监控回调
     *
     * @param monitorCallback
     */
    public static void setMonitorCallback(MonitorCallback monitorCallback) {
        GlobalMonitorCallback.setCallback(monitorCallback);
    }

    /**
     * 安装类型编织器
     *
     * @param typeWeaver 类型编织器
     */
    public synchronized static void installTypeWeaver(TypeWeaver typeWeaver) {
        TypeWeaverFactory.install(typeWeaver);
    }


    /**
     * 卸载类型编织器
     *
     * @param pointClass 类型
     */
    public synchronized static void uninstallTypeWeaver(Class pointClass) {
        TypeWeaverFactory.uninstall(pointClass);

    }


}
